#include "MaSocket.h"

MaSocket::MaSocket(QTcpSocket *socket, QObject *parent)
{
    this->parent = parent;
    this->socket = socket;
    connect(socket, SIGNAL(readyRead()), this, SLOT(donneesRecues()));
    tailleMessage = 0;
}

MaSocket::~MaSocket()
{
    //if(socket) socket->deleteLater();
}

void MaSocket::donneesRecues()
{
    QDataStream in(socket);

    if (tailleMessage == 0) // Si on ne connaît pas encore la taille du message, on essaie de la récupérer
    {
        if (socket->bytesAvailable() < (int)sizeof(quint16)) // On n'a pas reçu la taille du message en entier
            return;

        in >> tailleMessage; // Si on a reçu la taille du message en entier, on la récupère
    }

    // Si on connaît la taille du message, on vérifie si on a reçu le message en entier
    if (socket->bytesAvailable() < tailleMessage) // Si on n'a pas encore tout reçu, on arrête la méthode
        return;

    quint8 typeApplication;
    in >> typeApplication;

    quint8 typeMessage;
    in >> typeMessage;

    // On lit le reste du message pour éviter tout décalage
    // à cause d'une erreur dans une des parties de la partie décodage
    QByteArray contenuMessage = socket->read(tailleMessage-sizeof(typeApplication)-sizeof(typeMessage));

    // On remet tailleMessage à 0 pour le message suivant
    tailleMessage = 0;

    traitementMessage(typeApplication, typeMessage, contenuMessage);
}

QTcpSocket* MaSocket::getSocket()
{
    return socket;
}

//void MaSocket::traitementMessage(quint8 typeApplication, quint8 typeMessage, QByteArray contenu){}


void MaSocket::envoyerMessage(quint8 idApplication, quint8 idMessage, const QString &message)
{
    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);

    out << (quint16) 0;
    out << (quint8) idApplication;
    out << (quint8) idMessage;
    if(message != "") out << message;
    out.device()->seek(0);
    out << (quint16) (paquet.size() - sizeof(quint16));

    socket->write(paquet);
}

void MaSocket::envoyerMessage(quint8 idApplication, quint8 idMessage, const QByteArray &message)
{
    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);

    out << (quint16) 0;
    out << (quint8) idApplication;
    out << (quint8) idMessage;
    out << message;
    out.device()->seek(0);
    out << (quint16) (paquet.size() - sizeof(quint16));

    socket->write(paquet);
}

void MaSocket::deconnecterSocket()
{
    socket->close();
}
